home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok70.lha
/
IFFSupport1.7
/
IFFSupport.dok
next >
Wrap
Text File
|
1993-08-15
|
10KB
|
314 lines
=============================================================================
= = = IFFSupport = = =
© Copyright 1991 by
Fridtjof Siebert
Nobileweg 67
7000 Stuttgart 40
=============================================================================
Mit den von IFFSupport exportierten Prozeduren können IFFBilder geladen,
gespeichert und Colorcycling-Bilder gezeigt werden.
Anders als bei anderen IFF-Unterstützungsroutinen (Ich habe die des
TDI-M2-Compilers angesehen) werden hier die geladenen Daten in bekannten
Formaten (Screens, Windows und BitMaps) und nicht so, wie sie im IFF-File
vorliegen, übergeben. Dadurch vereinfacht sich die Handhabung.
------ Dieses Paket umfaßt folgende Dateien: ------
IFFSupport.dok : Diese Datei.
txt/IFFSupport.mod : Der Oberon-Quelltext
txt/LoadBody.asm : Der Assembler-Quelltext der Maschinenroutine.
sym/IFFSupport.sym : Symbol-Datei.
obj/IFFSupport.obj[s]: Objektdateien (mit Assemblerteil gejoint)
obj/LoadBody.o : Der assemblierte Assemblerquelltext. Muß evtl.
beim linken angegeben werden ('OBJ LoadBody.o')
ShowIFF : ILBM-Ladeprogramm.
txt/ShowIFF.mod : sein Quelltext.
ShowCycle : ILBM-Lader für Colorcycling-Bilder.
txt/ShowCycle.mod : Quellcode.
------------------------ Variablen & Typen: -----------------------------
Von IFFSupport werden folgende Variablen und Typen exportiert:
TYPE
IFFInfoTypePtr = POINTER TO IFFInfoType;
IFFInfoType = RECORD
... (* Mega-Record *)
END;
VAR
IFFInfo: IFFInfoType;
IFFInfo enthält Informationen über das zuletzt geladenen Bild oder
Informationen über ein zu speicherndes Bild. Wenn mehrere Bilder verwendet
werden, müssen eigene Variablen vom Typ IFFInfoType definiert werden, da
bei jedem neuen Laden IFFInfo überschrieben wird.
------
VAR
NuScreen: NewScreen;
NuWindow: NewWindow;
Können importiert werden, um später einen Screen mit der Grafik oder ein
Window in dem Screen zu öffnen. siehe auch ReadILBM();
------
TYPE
IFFErrors = SHORTINT;
CONST
iffNoErr * = 0;
iffOutofMem * = 1;
iffOpenScreenfailed * = 2;
iffOpenWindowfailed * = 3;
iffOpenfailed * = 4;
iffWrongIFF * = 5;
iffReadWritefailed * = 6;
VAR
IFFError: IFFErrors;
IFFErrors enthält die Fehlerart, wenn das Laden oder Speichern eines Bildes
erfolglos war.
iffNoErr: Kein Fehler
iffOutofMem: Nicht genügend Speicher
iffOpenScreenfailed: OpenScreen ist fehlgeschlagen
iffOpenWindowfailed: Es konnte kein Fenster geöffnet werden
iffOpenfailed: File konnte nicht geöffnet werden
iffWrongIFF: Kein IFF-File
iffReadWritefailed: Schreib/LeseFehler
--------------------------- Prozeduren: ---------------------------------
------ Laden von IFF-Bildern: ------
CONST
(* ReadILBMFlags: *)
front * = 0;
visible * = 1;
dontopen * = 2;
window * = 3;
TYPE
ReadILBMFlagSet * = SET;
PROCEDURE ReadILBM(name: ARRAY OF CHAR; Flags: ReadILBMFlagSet;
VAR Screen: I.ScreenPtr; VAR Window: I.WindowPtr): BOOLEAN;
ReadILBM lädt ein IFFBild mit dem Namen name. Trat ein Fehler auf, wird
FALSE zurückgegeben.
Folgende Flags können gewählt werden:
- front: Wenn gesetzt, wird der Screen, in den die Grafik geladen
wird, vor allen anderen Screens geöffnet, sonst dahinter.
- visible: Wenn visible nicht gesetzt ist, wird während dem Laden das
Display mit GfxMacros.OffDisplay() ausgeschaltet. Das erhöht
die Ladegeschwindigkeit, besonders bei Bildern mit hoher
Auflösung und/oder vielen Farben.
- dontopen: Wenn gesetzt wird kein Screen geöffnet. Der zurückgegebene
ScreenPtr ist dann NIL. Die Grafik wird in eine BitMap
geladen. Der Zeiger auf die BitMap steht in
IFFSupport.NuScreen.customBitMap. Der Screen kann später mit
OpenScreen geöffnet werden. Bei gewähltem dontopen muß der
Speicher für die BitPlanes und die BitMap-Struktur später
wieder freigegeben werden.
- window: Wenn gesetzt wird vor dem Laden der GrafikDaten in den Screen
ein Fenster mit der Größe der Grafik geöffnet. Dadurch können
später Gadgets, Menüs etc. hinzugefügt werden, ohne die
Grafik zu zerstören. Ist window gelöscht, ist der WindowPtr
NIL.
Die Laderoutine unterstützt alle Auflösungen: Lores, Hires, Interlace, Hold
and Modify, ExtraHalfBrite. Gepackte Bilder werden entpackt. Da der
Entpacker in Maschinensprache geschrieben ist, werden gepackte Bilder
schneller geladen als ungepackte.
------ ColorCycling: ------
PROCEDURE DoCycle(Info: IFFInfoTypePtr; Screen: I.ScreenPtr): BOOLEAN;
PROCEDURE EndCycle(Info: IFFInfoTypePtr);
Mit DoCycle kann das ColorCycling für eine Grafik eingeschaltet werden.
Dazu wird ein VBlank-Interrupt initialisiert. Das Cycling läuft also im
Hintergrund des eigenen Programms.
DoCycle benötigt einen ScreenPtr und die Addresse einer IFFInfoType-
Variablen. Werden mehrere Bilder gleichzeitig mit ColorCycling gezeigt,
müssen auch verschieden Variablen verwendet werden ! DoCycle() gibt FALSE
zurück, wenn ein Fehler auftrat, d.h. mehr als 32 ColorCycling-Bilder
gleichzeitig eingeschaltet sind. Da dies gewöhnlich nicht der Fall ist,
kann DoCycle mit `IF DoCycle(ADR(IFFInfo),Screen) THEN END;' aufgerufen
werden.
EndCycle() stoppt das ColorCycling wieder. Dazu wird der gleiche
IFFInfoTypePtr benötigt wie bei DoCycle. EndCycle darf nicht vergessen
werden, da die Interrupts sonst von IFFSupport nicht entfernt werden. Also
spätenstens in der TermProcedure kurz vor dem Schließen des Screens
aufrufen !!! Ich hätte die Interrupts auch in der Termprocedure von
IFFSupport ausschalten können, doch gäbe es dann sicher Leute, die sich
darauf verlassen würden und in ihrer Termprocedure lediglich den Screen
schließen und das Cycling nicht ausschalten. Dies hätte zur Folge, daß die
Farben eine kurze Zeit auf einem nicht mehr vorhandenen Screen cyclen, es
gäbe also höchstwahrscheinlich einen Guru.
------ Speichern von IFF-Bildern: ------
Zum Speichern gibt es 3 ähnliche Prozeduren:
PROCEDURE WriteILBMScreen(Name: ARRAY OF CHAR;
Screen: I.ScreenPtr;
Rect: g.RectanglePtr;
CompressIt: BOOLEAN): BOOLEAN;
Speichert den Screen `Screen' mit dem Namen `Name'. Trat ein Fehler
(iffOpenfailed oder iffReadWritefailed) auf, wird FALSE zurückgegeben.
Ist CompressIt TRUE, wird ein gepacktes File erzeugt.
Rect kann, wenn der ganze Screen gespeichert werden soll, NIL sein. Sonst
enthält es einen Zeiger auf ein Graphics.Rectangle. Rect^.minX/minY ist
dann die linke obere und Rect^.maxX/maxY die rechte untere Ecke des
Ausschnitts. Dabei sollte man Ausschnitte größer als der Screen oder
ähnliche Späße vermeiden. Rect^.minX und Rect^.maxX brauchen keine
Vielfachen von 16 sein. Sind sie es wird jedoch schneller gespeichert.
------
PROCEDURE WriteILBM(Name: ARRAY OF CHAR;
RP: g.RastPortPtr;
VP: g.ViewPortPtr;
Rect: g.RectanglePtr;
CompressIt: BOOLEAN): BOOLEAN;
Speichert wie WriteILBMScreen ein IFF-File.
Name, Rect, CompressIt und der RETURN-Wert entsprechen WriteILBMScreen.
RP zeigt auf den RastPort, der die Grafikdaten enthält.
VP zeigt auf den ViewPort. der die Farben und ViewModes etc. enthält.
Mit WriteILBM kann folgendermaßen ein Fenster gespeichert werden (das Fenster
muß vor allen anderen Fenstern liegen):
VAR
Window: Intuition.WindowPtr;
Rect: Graphics.Rectangle;
OK: BOOLEAN;
...
WITH Window^ DO
WITH Rect DO
minX := leftEdge;
minY := topEdge;
maxX := minX + width - 1;
maxY := minY + height - 1;
END;
Error := WriteILBM(Name,rPort,ADR(wScreen^.viewPort),ADR(Rect),TRUE);
END;
------
PROCEDURE InitIFFInfo(Info: IFFInfoTypePtr;
RP: g.RastPortPtr;
VP: g.ViewPortPtr;
VAR Rect: g.RectanglePtr);
PROCEDURE WriteILBMAll(Name: ARRAY OF CHAR;
Info: IFFInfoTypePtr;
BM: g.BitMapPtr;
FirstLine, LeftOffset: INTEGER;
CompressIt: BOOLEAN): BOOLEAN;
WriteILBMAll kann auch Bilder mit Zusatzinformationen wie ColorCycling etc.
speichern. Dazu wird die Addresse einer initialiesierten IFFInfoType-
Variablen benötigt. Um die Initialisierung zu erleichtern, kann die
Prozedur InitIFFInfo() aufgerufen werden. Ihre Parameter entsprechen denen
von WriteILBM. Danach sind die Unterrecords BMDH, CMAP und CAMG
initialisiert und deren Flags in Info^.IFFTitle gesetzt. Weitere
Unterrecords können dann `von Hand' initialisiert und deren Flags gesetzt
werden.
BM zeigt auf die BitMap, die die zu speichernden Planes enthält. BM kann
auch extra zum Speichern initialisiert werden, wenn man z.B. eine
zusätzliche MaskPlane speichern möchte.
FirstLine und LeftOffset entsprechen Rect^.minY und Rect^.minX.
CompressIt und der RETURN-Wert entsprechen WriteILBMScreen.
-------------------------- Demonstartionen: ----------------------------
------ ShowIFF: ------
Das Programm ShowIFF lädt und zeigt ein IFF-Bild. Es lädt das vorher auf
der Workbench angeklickte oder, beim Starten vom CLI, das hinter dem Namen
angegebene Bild. Bilder, die ShowIFF als Default-Tool haben (Info), können
durch einfachen Doppelklick angezeigt werden. An diesem kurzen Programm
kann man leicht die Verwendung der Ladeprozedur studieren.
------ ShowCycle: ------
Entspricht ShowIFF für Colorcycling-Bilder. Normallerweise kann es auch für
nicht-Cycling Bilder verwendet werden, wenn die Cyclinginformationen korrekt
ausgeschaltet sind.
---------------------------- Copyright: -----------------------------------
Das Modul kann von jedem in nicht kommerziell genutzten Programmen frei
verwendet werden.
Bevor ein Programm, das dieses Modul benutzt, kommerziell genutzt oder
vertrieben wird, muß sich der Autor mit mir in Verbindung setzten und eine
eventuelle Vergütung aushandeln.
--- Fridtjof.
-----------------------------------------------------------------------------